public class ReadMe {
    /**
     * 2022-11-11 项目搭建和数据库连接
     * 1。项目搭建
     *      file-new-project-maven--创建项目
     *      src 一般写Java后台代码
     *      main  正式写代码的地方
     *          java  写Java代码
     *          resources  资源文件
     *      test  测试用例：@Test 以后我们写的任何一个代码都应该测试是否正确
     * 2.测试项目是否搭建正确：启动项目看是否能够访问页面
     * 3.配置tomcat
     * ---------------------------------------------------
     * 思路分析：
     *      第四阶段：后台关系系统：将前端页面的数据可以在系统里面修改然后渲染到页面
     *      1.前端
     *      2.后台
     *      3.数据（已学过）
     * ---------------------------------------
     * 后台：
     *      1.前端页面要发送数据到Java后台
     *      2.Java后他接收前端数据
     *      3.解析或者封装到一个容器里面
     *      4.将容器里面的数据存入数据库
     *      ----------------------------
     *      model   和数据库的列一一对应
     *      entity  同上
     *      pojo   所有的实体类的简称
     *      BO     业务逻辑 对象
     *      VO      value Object  /view object  （页面传递到后台的数据类型）
     *      DTO    data  trans  object   数据传输对象  后台传递给前端的数据
     *      ------------------------------------
     * 一般情况下，包名小写，不过，特殊的情况大写
     * -------------------------------------
     * 获取前端数据的包：servlet
     * maven 的主要作用就是管理jar包:因为项目里面会用到jar包，不用手动下载
     * 替代以前的lib，如果实在不会，则继续用以前的lib，将jar包复制进去即可
     * ------------------------------
     * doget和dopost的区别？
     * 以后只要是修改就用post，一般查询用get
     * 一般敏感信息用post，浏览器默认用get访问
     * -----------------------------------------
     * servlet  前端访问后台的地址
     *      1:继承HttpServlet
     *      2：重写里面的doPost或者doGet方法
     *      3：添加访问地址 @WebServlet("/back/user/add")
     *          0)乱码问题
     *          1)得到前端的数据
     *          2）封装数据到VO
     *          3）将数据传递到服务逻辑层（写逻辑的地方）
     *          4)得到服务逻辑层的结果
     *          5）返回结果给前端
     *          注意：
     *          1.前后端传递的时候可能出现乱码，所以要解决乱码问题
     *          2.后台返回给前端的数据有很多总数据类型，有没有思考前端接收的复杂程度？
     *          3.所以能不能通过统一的格式进行发送给前端？以后前后端传值全部通过对象进行传值
     *          4.虽然已经统一了数据类型的返回格式，但是前端看不懂Java的格式，所以需要转换为json格式
     * 后台代码写的逻辑思路
     * VO 拿到前端的值
     * servlet  六个步骤
     * DTO 返回给前端的值
     * service  业务逻辑
     * entity  实体类-和数据库列名一致
     * DAO  数据持久层
     * JDBC  访问数据库
     * ------------------------------------
     * 1.创建项目
     * 2.创建包  包的作用
     * 3.entity  和数据库一一对应
     * 4.VO 接收前端的数据
     * 5.DTO 返回前端的数据
     * 6.servlet  六大步骤
     * 7.service将前端数据复制到entity（实体）
     * 8.dao 写sql，调用JDBC方法
     *
     */
    /**
     * 2022-11-14 后台代码封装
     * 1.创建entity  和数据库列名一致，
     * 2.因为每个表都有共同的列名，所以entity 要提取公用的类BaseEntity
     * 3.创建VO，前端传递到后台的数据 不需要时间和id，如果是编辑和删除是需要id的；
     * 4.创建DTO，后台传递给前端的数据（后台管理系统），一般情况下和entity一致
     * 5.创建servlet 六大步骤：1，乱码，2.得到前端的值，3.封装到VO，4.调用service，5.得到返回值，6.返回给前端
     * 7.创建service 写逻辑的地方:1.将VO赋值到Entity，2.将dao的数据放入DTO；
     * 8.创建dao层，1.写sql语句，2.调用JDBC
     * ---------------------------
     * sql注入
     * 1.数据库里面所有的值不允许出现null情况
     * 2.如果做后台操作的时候，返回一个null对于前端程序员来说，看不懂，
     * 3.所以，我们应该和前端程序员达成一个一致的返回结果，统一结果
     * 4.封装返回值结果ResultDTO
     *
     */
    /**
     * 2022-11-15 后台封装
     * 1.对于实体类，每一个都有get/set方法，还有无参，有参数的构造方法，还有toString方法
     * 2.对于toString方法，子类无法将父类的方法写入到子类
     * 3.所以，我们要将父类的所有属性写入子类，代码量就太高了，
     * 4.需要引入一个jar包，理解为插件也可以，让它给我们把set/get方法和toString方法和构造方法自己写
     * 5.这个包叫做Lombok
     * 6.数据库一般条数大于500万条或者数据大于2G，则考虑分库分表
     * 7.如果没有分库分表，则需要索引，或者不要全部查询出来：用户只能看到一部分，所以需要条件查询
     * 8.以后所有的查询都应该给条件，最好有分页条件: limit (page-1)*size,size
     * 9.条件查询还应该有：如果是整型，和日期，都应该有区间查询，如果是字符，都应该有模糊查询
     * 10.条件查询：只要页面显示了数据内容，则条件查询都应该具备
     * 11.条件查询where 后面跟一个true或者1=1
     * 12.StringUtils.isEmpty判断是否为空和null
     * 13.修改数据的时候，参数应该和增加一致（差不多），只是多了一个id
     * 14.ResultDTO 结果集工具，不应该提供公共构造方法，应该提供外部一个接口
     * ------------------------------------
     * 产品：
     * 1.entity ProductEntity
     * 2.VO ProductVO
     * 3.DTO ProductDTO
     * 4.servlet 六大步骤
     * 5.service  1.写dao的对象 ,
     * 6.dao  sql 和解析ResultSet
     * -----------------------------
     * 注意：
     * 1.每一个findAll都要加分页
     * 2.分页的servlet 每一个都要加page，limit的转换
     * 3.每一个表都要加一个查询总条数,而且和findAll的条件一致
     * 4.select count(*) from company where 1=1
     * ---------------------------------------
     */
    /**
     * 2022-11-16 mybatis引入
     * 1.以前写jdbc或者sql语句的时候不方便；所以要将属于数据库的东西踢出去
     * 2.将sql语句放入到另一个文件（xml）
     * 3.所以需要通过流去读取xml文件：因为dao层每个地方都要去读，所以，应该写一个工具类去读取
     * 4.将读取的内容放入一个容器里面：sqlsession
     * ----------------------------------------------
     * mybatis
     * 步骤：
     * 1.写一个工具类：读取xml文件  GetSqlSession.java
     * 2.导入mybatis的jar包
     * 3.配置config文件：mybatis-config.xml
     *      1)读取jdbc.properties <properties resource="jdbc.properties"></properties>
     *      2）配置数据库的url，user，pass
     *      3）将sql语句打印到控制台 <setting name="logImpl" value="STDOUT_LOGGING"/>
     *      4）对应sql语句文件  <mapper resource="/mapper/UserMapper.xml" />
     * 4.配置sql文件
     *      UserMapper.xml
     *      1） <insert id="add" parameterType="com.wanxi.entity.UserEntity">
     *          id对应dao层的方法名
     *          parameterType可以不要
     * ------------------------------------------
     * 添加公司信息：
     *      1)在mybatis-config.xml添加       <mapper resource="/mapper/CompanyMapper.xml"/>
     *      2）创建CompanyMapper.xml
     *      3）在CompanyMapper.xml里面添加代码（和）CompanyDao里面的方法一致
     *      4）修改CompanyDaoImpl，调用GetSqlSession.增删查改的操作
     * 注意：
     * 1：mapper.xml里面的返回值类型和entity相对应，数据和entity默认列如果相同，则自动赋值
     *              如果不同，则需要名别名
     * 2：如果不想名别名，或者有很多地方都要用到*，则用map进行映射
     * 3：以后我们查询数据的时候尽量不要用*
     * ------------------------------------------------
     * 总结：
     * 1.jar包
     * 2.配置config.xml
     * 3.创建mapper.xml
     * 4.GetSqlSession连接对象
     * 5.mapper.xml和dao层方法相互对应
     * 6.在dao层的实现层写调用方法 return GetSqlSession.getSqlSession().insert("com.wanxi.dao.CompanyDao.add", companyEntity);
     * 7.写sql语句
     *
     */
    /**
     * 2022-11-17 前端基础
     * 1.下载前端模板：
     * 2.复制模板到web下面：不要动里面的任何内容
     * 3.在web下面创建自己的 包，复制需要的文件:login.html
     * 4.在web.xml里面写项目启动直接访问的页面
     * 5.登录的一个流程：
     *      1）创建一个页面login.html
     *      2)写一个表单 form表单
     *      3）点击提交按钮：有一个前置：（用户必须按照规定的进行输入，只有输入正确才让用户进入下一步）
     *      4）将数据传递到Java：Java里面就应该查询数据库，判断是否有当前用户和密码
     *      5）如果没有，则让用户重新输入用户名或密码
     *      6）如果正确，则进行后台管理页面
     *---------------------------------------------------------
     * Java                               JavaScript
     * 字面量                                  值，常量
     * 标识符                                  用来命名的:变量名
     * 变量 数据类型 变量名=值；int a=1;          let a=1;  let就是用来定义变量
     * 数据类型：基本数据类型，引用数据类型         五种：数字，字符，布尔，对象，数组
     * 运算符                                  同Java
     * if else for                            同Java
     * while                                    同Java
     * 数组 二维数组                              同Java
     * 方法                                    function method(name){};
     * 面向对象基础                             对象的属性，方法，怎么抽取对象
     * 字符串                                  同Java
     * 集合基础                                 js数组
     * 高阶：
     * 继承
     * 多态
     * 接口
     * lambda表达式
     * 常用API
     * 异常和日期
     * 集合List
     * 集合set
     * 集合map
     * Stream
     * file
     * 字节流字符流
     * 其他流，缓存流对象流properties流
     * 网络基础UDT TCP
     * 反射
     * 日志
     * 注解
     * xml
     * 枚举
     */
    /**
     * 2022-11-18 js基础
     * 1.js数据的赋值取值
     * 2.常量 const
     * 3.打印到控制台
     * 4.js对象
     * 5.打印数据类型 console.log(typeof arr)
     * 6.layui的知识点
     *      1） layer.msg("aaa",{icon:6})
     * 7.ajax
     *             $.ajax({
     *                 url: '/login',//这里对应Javaservlet里面的WebServlet的注解
     *                 data: data.field,//传递到后台的数据对象
     *                 type: 'post',//对应后台的方法
     *                 dataType: 'json',//后台传递给前端的数据格式
     *                 success: function (res) {//如果成功，则得到后台返回给前端的数据res
     *                     console.log(res);
     *                 }
     *             });
     * 8.用户登录的时候，应该将密码进行加密后和数据库的密码进行比较
     * 9.用户添加的时候，就应该将密码加密后存入数据库：推荐用MD5
     * 10.js里面对象{"username":"supeng","password":"aaaaaa"}
     *      里面的usernmae对应的是form表单的name值
     * -------------------------------------------
     * 登录逻辑前端：
     * 1）创建页面
     * 2）编写js，对按钮添加事件： form.on('submit(login)', function (data) {
     * 3）得到form表单的值： data.field
     * 4）将值传递到后台：ajax
     * 5）得到后台的结果success: function (res)
     * 6）根据res的结果进行逻辑处理
     * ---------------------------------------
     * 1.前端页面数据传递:java servlet作用域：request，session，application
     * 2.js 将数据存入session
     * 3.sessionStorage.setItem("username", data.username)
     * 4.在另一个页面得到值： sessionStorage.getItem("username");
     * 5.日期格式化
     * 6.定时器：setInterval(function () {
     *         let nowTime = new Date().format("yyyy-MM-dd h:m:s");
     *         $("#loginTime").html(nowTime);
     *     }, 1000)
     */
    /**
     * 2022-11-21 用户查询和新增
     * 1.登录逻辑：
     * web前端：
     *          1）创建页面
     *          2）创建js文件
     *          3）监听按钮事件（对按钮进行点击）
     *          4）拿到form表单的数据（data.field）(里面的json对象，里面的key值对应form表单的name属性值)
     *          5）通过ajax将数据传递到java后台，并得到后台响应给前端的值
     *          6）根据想要的值，进行逻辑处理
     * java后端：
     *          1）servlet 六大步骤（页面控制层）
     *          2）service 逻辑处理（服务逻辑层）密码加密
     *          3）dao 数据持久层  调用mybatis的xml文件
     * 2.web页面之间相互传值
     * 3.定时器
     * -----------------------------------------------------
     * 用户查询：
     * 前端：
     *      1）创建页面
     *      2）赋值table：<table class="layui-hide" id="table" lay-filter="table"></table>
     *      3）创建js user-list.js
     *      4）渲染table：layui.use(['table'], function () {
     *      5）渲染 表格  table.render({
     *          1）修改 elem: '#table'//js#一般对应id
     *          2）修改url： , url: '/back/user/all'
     *          3）开启分页： , page: true//开启分页
     *          4）设置列 ：, cols: [[
     *              1）field 对应后台传递过来的key值：dto里面的属性
     *              2）title 表格的名称
     *              3）templet 自定义模板（三种）
     *              4）操作栏： , {fixed: 'right', title: '操作', width: 200, minWidth: 125, toolbar: '#barDemo'}
     *  后台：
     *      1）servlet  增加page和limit
     *      2）service  在findAll增加查询总条数和查询所有
     *      3）dao 层
     *      4）mapper.xml 写sql语句
     *---------------------------------------------------------
     * 增加：
     *  web前端
     *      1）创建页面：添加表单元素
     *      2）点击提交按钮的时候，需要判断输入表单格式是否正确
     *      3）在添加监听按钮里面添加ajax
     *      4）根据返回结果进行逻辑处理
     *  java后台：
     *      以前以前做完
     *
     */
    /**
     * 2022-11-22 用户编辑和删除和模糊查询
     * web端：前端（流程图）要理解代码的执行顺序
     *      1）创建页面
     *      2）创建js（如果需要用户提交信息，则需要验证用户输入格式是否正确，正则表达式）
     *      3）调用后台
     *      4）根据后台返回的数据进行逻辑处理
     * Java端：后端
     *      1）VO 接收前端的数据实体
     *      2）servlet 六大步骤：前端访问后台接口地址
     *      3）service 逻辑处理：VO--》entity    entity--》DTO
     *      4）dao层  调用mapper.xml
     *      5）写sql语句 并返回正确的数据
     *---------------------------------------------------------------------
     * 注意：删除数据库的数据 :区分一下三种方式的区别？
     * 1.delete from user  删除某一条数据    但是记录还在
     * 2.truncate user; 删除所有数据，保留表格式  id从0开始
     * 3.drop user; 删除表结构
     *
     * 如果页面是复选框，则直接通过form表单拿不到数据，需要重写写代码
     *-----------------------------------------------------------
     * 编辑：思路？
     *  1）不要将当前所有数据直接传递到编辑页面，因为有些数据不用展示出来
     *  2）查询大忌：将所有数据全部查询出来  select * 以后禁用
     *  3）点击编辑的时候，应该只给一个id，然后弹出编辑页面，根据id到数据库里面去查询
     *  4）将查询出来的数据回显到页面
     *  5）用户资料和密码不应该在同一个页面进行编辑，而应该分开
     *  -------------------------------------------------
     * 编辑：web前端
     *      1）创建页面：删除密码修改的div
     *      2）创建js
     *      3)根据编辑按钮传递过来的id，查询数据库，并将数据显示到页面
     *      4）点击编辑按钮（之前需要验证输入格式是否正确）
     *      5）根据后台传递的数据进行逻辑处理
     *      6)刷新页面
     *
     */
    /**
     * 2022-11-23 编辑，删除，模糊查询
     * 编辑：
     *      前端：
     *          1)点击编辑按钮，跳转新页面（前提：要将id传递到另一个页面）
     *              为什么不能直接传递数据到另一个页面?
     *              1.可能查询显示3列数据，但修改需要修改5列数据
     *              2.有可能传递过去的时候发生丢包（丢数据的时候）
     *              3.页面之间传递数据会拉慢页面的反应时间
     *              4.有可能拿到的是无效数据（可能另一个管理员在他编辑之前已经进行编辑）
     *          2）编辑页面加载完成后，根据id在数据库里面查询当前数据
     *          3）根据查询的数据，对编辑页面表单进行赋值
     *          4）点击编辑按钮进行编辑（自定义验证）
     *          5)根据返回的结果处理逻辑关系
     *       后端：
     *          1）servlet
     *          2）service
     *          3）dao
     *-------------------------------------------------
     *  表单赋值
     *   form.val('setData', {
     *             "username": data.username // "name": "value"
     *
     *             , "phone": data.phone
     *             , "email": data.email //复选框选中状态
     *             , "birthday": data.birthday //开关状态
     *             , "sex": data.sex
     *             , "enable": data.enable
     *         });
     *  复选框赋值：思路？
     *  --------------------
     *  怎么判断js里面的某些代码是否执行？
     *  1.console.log(1);
     *  2.js debug
     *  -------------------------------------------
     *  删除：
     *      1.找到删除按钮 得到id
     *      2.提示用户是否需要删除
     *      3.条用ajax
     *      4.根据返回结果进行逻辑处理
     * ---------------------------
     * Java里面什么时候才有DTO？
     * 因为增加，修改，删除只需要返回影响的条数，所以不需要dto
     * 而查询返回的是具体数据需要DTO
     * -----------------------------
     * 模糊查询：
     *      前端：
     *      1）创建页面表单
     * -------------------------
     * 写代码的时候，永远记着判断是否为空
     * -------------------------------------------
     * 难点：sql语句：模糊查询：if，for
     * 前端：取值，赋值
     * 后台：servlet里面添加对前端取得的值进行判断
     */
    /**
     * 2022-11-24 产品新增思路分析和菜系获取
     * 1.separator="or"  分隔符
     * 2.find_in_set  在集合里面查找元素
     * 3.查询页面的时候，如果你的数据过多，则定义一个宽度，layui默认隐藏
     * 4.如果数据过多，建议不要显示在查询页面，而应该给一个预览页面
     * 5.重点注意：点击模糊查询的时候，查询总条数和模糊查询的查询条件应该一致
     * 6.tableRender的代码复用
     * -------------------------
     * 产品：产品查询：
     *      前端：
     *          1）创建页面
     *          2）创建js
     *          3）调用table.render();
     *      后台：
     *          1）servlet
     *          2）service  查询所有的时候，需要得到分页数据和数据条数
     *          3）dao
     *          4)xml sql语句
     *          5)在mybatis-config.xml里面添加mapper.xml ProductMapper.xml
     *  -------------------------------------
     *  查询产品（两张表）：
     *      1：应该查询所有产品数据：left join
     *      2：查询完后，还可以做模糊查询  需要将刚刚查询的数据作为子查询，在剩下的数据里面进行模糊查询
     *      select * from (
     *              select p.*,c.name cuisineName from  product p
     *              left join cuisine c
     *              on p.cuisine_id=c.id)
     *              aa
     *           where name like '%回%'
     * ------------------------------------------
     * 增加：思路
     *      前端：
     *          1）创建页面
     *              和普通页面多一个文件上传
     *              添加产品时，最好添加一个菜系:而菜系应该从数据库里面查询出来
     *              还多一个富文本：就是可以添加产品描述
     *          2）创建js
     *          3）点击按钮进行添加
     * ------------------------------
     * 今日重点：
     *      1）查询产品sql语句   子查询
     *      2）增加产品时，应该将菜系全部拿到，并赋值给下拉菜单
     *
     */
    /**
     * 2022-11-25 文件上传和富文本
     * 1.包名全部小写，只不过类名里面对于特殊的全大写：UserVO，-->UserViewObject
     * 2.sql语句里面 最好不要写*，如果要写，则需要用映射的方式
     * 3.java 编译后，out文件是对web的编辑，target是对Java后台的编译
     * 4.文件上传步骤
     *      1）复制html，删除进度条
     *      2）复制js  upload的，修改elem，url，删除进度条的js
     *      3）设置当前预览图片的高宽
     *      4）将文件传递到服务器（Java后台）进行保存
     *            Java后台：
     *              1）Java得到前端的数据：请问应该用什么来接收？
     *              2）文件应该用流来接收
     *              3）只不过还是用request来接收，需要将接收的数据转换为流（文件）
     *              4)List<File>   list=(List<File>)req;
     *              5)遍历文件，然后将文件保存到某个地方
     *              6）保存前提：文件地址，文件名称 File file=new File(path,fileName);
     *              7)outputSteam.write(list[0]);
     *              8）将保存的地址发送给前端：path,fileName;
     *              9)前端提交数据进行产品增加的时候，需要得到产品图片的地址
     *                      地址应该通过产品图片上传的时候返回的地址，
     *                      怎么得到图片上传返回的地址：用一个全局遍历
     *              ---------------------
     *              10)写Java代码
     *              11)做文件上传第一件事请，就是引入文件上传的包
     *
     *
     * 5.文件上传的时候，不要将文件存入数据库，而是应该将文件存入硬盘，得到地址，将地址存入数据库
     * 6.数据库里面的地址最好存绝对地址:一定以/做斜杠开头
     * 7.文件上传的时候，应该将文件名称设置唯一，
     * 8.做项目的时候，可能随时删除out和target文件，所以，这里copy一份文件到web目录下
     * 9. 文件复制
     * 10.try with resource
     * ---------------------------------
     * 产品新增：
     *  1）下拉菜单  菜系
     *  2）图片上传 （得到图片地址"/upload/aa.jpg"）
     *  3）得到所有数据 (自定义验证)
     *  4）点击按钮进行提交（同用户新增）
     */
    /**
     * 2022-11-28 富文本
     * 富文本：
     *      前端：
     *          1）引入js：wangEditor.js
     *          2）创建html：<div id="content" style="height: 500px;width: 500px">
     *                     </div>
     *          3）创建js：product-add.js
     *                   const E = window.wangEditor;
     *                   。。。。。
     *                    editor.create();
     *          4）修改调用后台地址：const editUrl = '/upload';//服务器访问地址
     *          5）将得到的地址图片回显到富文本
     *              let url = result.data.src;
     *             console.log(url);
     *             insertImg(url)//回显到富文本里面
     *          6）点击提交按钮之前，得到富文本内容：
     *             data.content = editor.txt.html();
     *          7)对富文本赋值：
     *             editor.txt.html(data.content);
     */
    /**
     * 2022-11-29 过滤器和前端赋值
     * 前端利用第三方来调用后台？文件上传，富文本，get,post
     *      1)引入别人写好的js文件
     *      2）创建html页面
     *      3）直接调用Java后台；
     * -----------------------------------------------
     * 系统做完以后，不能让用户直接访问接口或者直接访问页面？
     *      1）不能访问页面
     *          访问页面之前将访问后台的接口给断了
     *          在用户访问页面之前，判断是否已经登录，
     *          1）如果已经登录则直接放行，
     *          2）如果没有登录则返回登录页面
     *          3)怎么来判断是否已经登录？
     *          4）那么我们应该有一个数据进行共享？
     *             <script src="/js/myAjax.js"></script>
     *      2）不能访问接口
     *          1)判断是否已经登录
     *          2）怎么判断是否已经登录？
     *          3）在那个地方写？写什么？过滤器
     *  -----------------
     *  页面转发和重定向的区别？
     *  doget和dopost的区别？
     *
     */

}
